package com.atguigu.tingshu.search.service;

import co.elastic.clients.elasticsearch.core.SearchRequest;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import com.atguigu.tingshu.model.search.AlbumInfoIndex;
import com.atguigu.tingshu.model.search.SuggestIndex;
import com.atguigu.tingshu.query.search.AlbumIndexQuery;
import com.atguigu.tingshu.vo.search.AlbumSearchResponseVo;

import java.util.Collection;
import java.util.List;
import java.util.Map;

public interface SearchService {


    /**
     * 封装索引库文档对象，将指定已存在专辑上架保存到索引库
     *
     * @param albumId
     */
    void upperAlbum(Long albumId);

    /**
     * 仅用于测试-将指定专辑从索引库中删除
     *
     * @param albumId
     * @return
     */
    void lowerAlbum(Long albumId);

    /**
     * 专辑站内检索：支持关键字、分类及标签过滤，分页，高亮
     *
     * @param queryVo
     * @return
     */
    AlbumSearchResponseVo search(AlbumIndexQuery queryVo);


    /**
     * 根据检索入参对象封装检索请求对象
     *
     * @param queryVo 查询条件
     * @return
     */
    SearchRequest buildDSL(AlbumIndexQuery queryVo);

    /**
     * 解析ES检索结果
     *
     * @param searchResponse ES检索结果对象
     * @param queryVo
     * @return
     */
    AlbumSearchResponseVo parseResult(SearchResponse<AlbumInfoIndex> searchResponse, AlbumIndexQuery queryVo);

    /**
     * 查询指定一级分类下前7个三级分类，得到每个三级分类下热度前6的热门专辑
     *
     * @param category1Id 1级分类ID
     * @return
     */
    List<Map<String, Object>> searchCategory3Top6(Long category1Id);

    /**
     * 根据已填写关键字返回自动补全内容
     *
     * @param keyword
     * @return
     */
    List<String> completeSuggest(String keyword);

    /**
     * 解析建议响应结果
     * @param searchResponse 检索响应对象
     * @param suggestName 自定义建议名称
     * @return
     */
    Collection<String> parseSugggestResult(SearchResponse<SuggestIndex> searchResponse, String suggestName);

    /**
     * 查询ES中不同分类下热门专辑列表，将不同分类下不同排序热门专辑放入Redis
     */
    void updateLatelyAlbumRanking();

    /**
     * 根据分类ID及热度方式查询专辑列表
     * @param category1Id
     * @param dimension
     * @return
     */
    List<AlbumInfoIndex> getRankingList(Long category1Id, String dimension);
}
